home *** CD-ROM | disk | FTP | other *** search
/ MacWorld Secrets (4th Edition) / Mac Secrets CD 4th Ed.toast / Apple Advanced Technologies / Apple Speech Technologies 1.5 / PlainTalk Developer Info / Speech Recognition Manager SDK / SR Sample Code / Weapons Example / Weapons.c < prev    next >
C/C++ Source or Header  |  1996-04-11  |  6KB  |  309 lines

  1. #include <Menus.h>
  2. #include <Events.h>
  3. #include <Quickdraw.h>
  4.  
  5. #include "Weapons.h"
  6. #include "SpeechWeapons.h"
  7.  
  8. // Globals
  9. Boolean            gFinished = false;
  10. WindowPtr        gMainWindow = nil;
  11. short            gCurrentWeapon = kFirstItem;
  12.  
  13. // Prototypes
  14. Boolean Initialize (void);
  15. void EventLoop (void);
  16. void Terminate (void);
  17.  
  18. void HandleMouseDown (EventRecord * event);
  19. void HandleKeyDown (unsigned char keyChar);
  20. void HandleMenuSelect (long menuChoice);
  21. void HandleUpdate (WindowPtr window);
  22.  
  23. pascal OSErr DummyAEHandler (AppleEvent *theAEevt, AppleEvent* reply, long refcon);
  24. pascal OSErr HandleQuitAE (AppleEvent *theAEevt, AppleEvent* reply, long refcon);
  25.  
  26. WindowPtr CreateMainWindow (void);
  27. void DrawMainWindow (WindowPtr window);
  28.  
  29. void main (void)
  30. {
  31.     if (Initialize ())
  32.         EventLoop ();
  33.     else
  34.         SysBeep (0);
  35.         
  36.     Terminate ();
  37. }
  38.  
  39. Boolean Initialize (void)
  40. {
  41.     Boolean        successfulStartup = false;
  42.     short        index;
  43.     EventRecord    event;
  44.     OSErr        status = noErr;
  45.     
  46.     InitGraf((Ptr) &qd.thePort);
  47.     InitFonts();
  48.     InitWindows();
  49.     InitMenus();
  50.     TEInit();
  51.     InitDialogs(nil);
  52.     InitCursor();
  53.  
  54.     for (index = 1; index <= 3; index++)
  55.         EventAvail(everyEvent, &event);
  56.  
  57.     if (!status)
  58.         status = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, 
  59.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  60.     if (!status)
  61.         status = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, 
  62.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  63.     if (!status)
  64.         status = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, 
  65.                                 NewAEEventHandlerProc (DummyAEHandler), 0, false);
  66.     if (!status)
  67.         status = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, 
  68.                                 NewAEEventHandlerProc (HandleQuitAE), 0, false);
  69.                                 
  70.     if (!status)
  71.         {
  72.         Handle menuBar = GetNewMBar(rMenuBar);
  73.         if (menuBar != nil)
  74.             {
  75.             SetMenuBar(menuBar);
  76.             DisposHandle(menuBar);
  77.             AddResMenu(GetMenuHandle(mApple), 'DRVR');    // add DA names to Apple menu 
  78.             DrawMenuBar();
  79.             }
  80.         else
  81.             status = (ResError() ? ResError() : 1);
  82.         }
  83.  
  84.     if (!status)
  85.         {
  86.         gMainWindow = CreateMainWindow ();
  87.         
  88.         if (gMainWindow == nil)
  89.             status = 1;
  90.         }
  91.     
  92.     MyInitSpeechRecognition ();
  93.     
  94.     if (!status)
  95.         successfulStartup = true;
  96.     
  97.     return successfulStartup;
  98. }
  99.  
  100. void EventLoop (void)
  101. {
  102.     while (!gFinished)
  103.         {
  104.         EventRecord        event;
  105.         unsigned char    keyChar;
  106.         
  107.         if (WaitNextEvent(everyEvent, &event, 1, nil))
  108.             {
  109.             switch (event.what)
  110.                 {
  111.                 case mouseDown :
  112.                     HandleMouseDown (&event);
  113.                     break;
  114.                 case keyDown :
  115.                     keyChar = event.message & charCodeMask;
  116.                     if (event.modifiers & cmdKey)
  117.                         HandleMenuSelect (MenuKey(keyChar));
  118.                     else
  119.                         HandleKeyDown (keyChar);
  120.                     break;
  121.                 case updateEvt :
  122.                     HandleUpdate ((WindowPtr) event.message);
  123.                     break;
  124.                 case kHighLevelEvent :
  125.                     AEProcessAppleEvent(&event);
  126.                     break;
  127.                 default :
  128.                     break;
  129.                 }
  130.             }
  131.         }
  132. }
  133.  
  134. void Terminate (void)
  135. {
  136.     MyCleanupSpeechRecognition ();
  137. }
  138.  
  139. void HandleMouseDown (EventRecord * event)
  140. {
  141.     WindowPtr    window;
  142.     short        partCode = FindWindow (event->where, &window);
  143.     
  144.     switch (partCode)
  145.         {
  146.         case inSysWindow :
  147.             SystemClick (event, window);
  148.             break;
  149.         case inContent:
  150.             break;
  151.         case inMenuBar :
  152.             HandleMenuSelect (MenuSelect(event->where));
  153.             break;
  154.         case inDrag :
  155.             DragWindow (window, event->where, &qd.screenBits.bounds);
  156.             break;
  157.         case inGoAway:
  158.             if (TrackGoAway (window, event->where))
  159.                 gFinished = true;
  160.             break;
  161.         default :
  162.             break;
  163.         }
  164.     
  165.     HiliteMenu (0);
  166. }
  167.  
  168. void HandleKeyDown (unsigned char keyChar)
  169. {
  170.     switch (keyChar)
  171.         {
  172.         case chLeft:
  173.         case chUp:
  174.         case chPageUp:
  175.             SetWeapon (--gCurrentWeapon);
  176.             break;
  177.  
  178.         case chRight:
  179.         case chDown:
  180.         case chPageDown:
  181.             SetWeapon (++gCurrentWeapon);
  182.             break;
  183.         
  184.         default:
  185.             break;
  186.         }
  187. }
  188.  
  189. void HandleMenuSelect (long menuChoice)
  190. {
  191.     short     itemNum;
  192.     Str255    daName;
  193.     GrafPtr    ourPort;
  194.     
  195.     itemNum = LoWord(menuChoice);
  196.     switch (HiWord(menuChoice))
  197.         {
  198.         case mApple :
  199.             GetItem (GetMenuHandle(mApple), itemNum, daName);
  200.             GetPort (&ourPort);
  201.             OpenDeskAcc (daName);
  202.             SetPort (ourPort);
  203.             break;
  204.         case mFile :
  205.             // all we've got is quit
  206.             gFinished = true;
  207.             break;                
  208.         default :
  209.             break;
  210.         }
  211. }
  212.  
  213. void HandleUpdate (WindowPtr window)
  214. {
  215.     if (window == gMainWindow)
  216.         {
  217.         BeginUpdate (window);
  218.         
  219.         DrawMainWindow (window);
  220.         
  221.         EndUpdate(window);
  222.         }
  223. }
  224.  
  225. pascal OSErr DummyAEHandler (AppleEvent *theAEevt, AppleEvent* reply, long refcon)
  226. {
  227.     return noErr;
  228. }
  229.  
  230. pascal OSErr HandleQuitAE (AppleEvent *theAEevt, AppleEvent* reply, long refcon)
  231. {
  232.     gFinished = true;
  233.     return noErr;
  234. }
  235.  
  236. WindowPtr CreateMainWindow (void)
  237. {
  238.     WindowPtr        newWindow = nil;
  239.     
  240.     newWindow = GetNewCWindow (rWindow, nil, (WindowPtr) -1);
  241.     if (newWindow)
  242.         SetPort (newWindow);
  243.  
  244.     return newWindow;
  245. }
  246.  
  247. void DrawMainWindow (WindowPtr window)
  248. {
  249.     PicHandle        pictHandle = nil;
  250.     Rect            portRect  = window->portRect;
  251.     
  252.     SetPort (window);
  253.     pictHandle = (PicHandle) GetResource ('PICT', gCurrentWeapon);
  254.     if (pictHandle)
  255.         {
  256.         Rect        picFrame = (*pictHandle)->picFrame;
  257.         short        theID;
  258.         OSType        theType;
  259.         Str255        name;
  260.         short        width;
  261.         FontInfo    fontInfo;
  262.         
  263.         // Draw name
  264.         
  265.         GetResInfo((Handle) pictHandle, &theID, &theType, name);
  266.         
  267.         TextFont (geneva);
  268.         TextFace (bold);
  269.         TextSize (24);
  270.         
  271.         GetFontInfo (&fontInfo);
  272.         
  273.         width = StringWidth (name);
  274.         
  275.         MoveTo ((portRect.left + portRect.right - width) / 2, 2 + fontInfo.ascent);
  276.         DrawString (name);
  277.         
  278.         
  279.         // normalize rect
  280.         OffsetRect (&picFrame, -picFrame.left, -picFrame.top);
  281.         
  282.         // draw the picture in the center, without stretching it
  283.         OffsetRect (&picFrame,
  284.                 (portRect.left + portRect.right) / 2 - (picFrame.left + picFrame.right) / 2,
  285.                 2 + fontInfo.ascent + fontInfo.descent + fontInfo.leading);
  286.         
  287.         DrawPicture (pictHandle, &picFrame);
  288.         
  289.         ReleaseResource ((Handle) pictHandle);
  290.         }
  291. }
  292.  
  293. void SetWeapon (short weaponID)
  294. {
  295.     WindowPtr         window = gMainWindow;
  296.     
  297.     SetPort (window);
  298.     EraseRect (&window->portRect);
  299.     
  300.     if (weaponID < kFirstItem)
  301.         weaponID = kLastItem;
  302.     else if (weaponID > kLastItem)
  303.         weaponID = kFirstItem;
  304.     
  305.     gCurrentWeapon = weaponID;
  306.     
  307.     DrawMainWindow (window);
  308. }
  309.